package org.tests;

import java.net.URI;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.TimeUnit;

import net.spy.memcached.CASValue;
import net.spy.memcached.internal.OperationFuture;

import com.couchbase.client.CouchbaseClient;
import com.google.gson.Gson;

public class CasExample {

	public static void main(String[] args) {
		System.out
				.println("--------------------------------------------------------------------------");
		System.out.println("\tCouchbase - Compare and Swap");
		System.out
				.println("--------------------------------------------------------------------------");

		List<URI> uris = new LinkedList<URI>();

		uris.add(URI.create("http://127.0.0.1:8091/pools"));

		CouchbaseClient cb = null;
		try {
			cb = new CouchbaseClient(uris, "default", "");

			Gson json = new Gson();

			// create data
			UserData user1 = new UserData();
			user1.doctype = "learn";
			user1.username = "asudarsan";
			user1.name = "Sudarsan Ambatipudi";
			user1.email = "sudarsan@email.com";
			user1.password = "p4ssw0rd";
			user1.logins = 0;

			//cb.set(user1.email, 0, json.toJson(user1));

			System.out
					.println("--------------------------------------------------------------------------");
			System.out.println("Initialize and Retrieve CAS");
			CASValue casValue1 = cb.gets(user1.username);

			System.out.println("Cas Value before update CAS 1 :"
					+ casValue1.getCas());

			System.out.println("");

			System.out
					.println("--------------------------------------------------------------------------");
			System.out
					.println("\tNow We'll update the document which results in a new CAS");
			user1.logins += 1;

			OperationFuture op = cb.replace(user1.email, 0, json.toJson(user1));
			System.out.println("\tNow CAS has changed [(cas1) "
					+ casValue1.getCas() + " != #{cas2} " + op.getCas() + "]");

			System.out
					.println("--------------------------------------------------------------------------");
			System.out
					.println("If we try to update the document from the second copy, it will fail");

			OperationFuture op2 = cb.asyncCAS(user1.email, casValue1.getCas(),
					json.toJson(user1));
			System.out.println(op2.getStatus());

			System.out.println("\n\n");

			cb.shutdown(10, TimeUnit.SECONDS);

		} catch (Exception e) {
			System.err.println("Error connecting to Couchbase: "
					+ e.getMessage());
		}

	}

}
